home *** CD-ROM | disk | FTP | other *** search
/ Aminet 6 / Aminet 6 - June 1995.iso / Aminet / util / cli / MultiFR10.lha / MultiFR / MultiFR.e < prev    next >
Encoding:
Text File  |  1995-04-14  |  5.8 KB  |  203 lines

  1. OPT OSVERSION=37
  2. OPT REG=5
  3.  
  4.  
  5. ->/////////////////////////////////////////////////////////////////////////////
  6. ->////////////////////////////////////////////////////// External modules /////
  7. ->/////////////////////////////////////////////////////////////////////////////
  8. MODULE 'dos/dos' , 'dos/exall'
  9.  
  10.  
  11. ->/////////////////////////////////////////////////////////////////////////////
  12. ->//////////////////////////////////////////////////// Exception handling /////
  13. ->/////////////////////////////////////////////////////////////////////////////
  14. RAISE    "ARGS"    IF    ReadArgs()            =    NIL ,
  15.         "MEM"    IF    String()            =    NIL    ,
  16.         "DOS"    IF    Open()                =    NIL    ,
  17.         "DOS"    IF    Read()                =    -1    ,
  18.         "DOS"    IF    Fwrite()            <>    1    ,
  19.         "DOS"    IF    Lock()                =    0    ,
  20.         "DOS"    IF    AllocDosObject()    =    NIL    ,
  21.         "^C"    IF    CtrlC()                =    TRUE
  22.  
  23.  
  24. ->/////////////////////////////////////////////////////////////////////////////
  25. ->////////////////////////////////////////////////// Constant definitions /////
  26. ->/////////////////////////////////////////////////////////////////////////////
  27. ENUM    FIND_STR , REPLACE_STR , FILES ,
  28.         NUMBER_ARGS
  29.  
  30.  
  31. ->/////////////////////////////////////////////////////////////////////////////
  32. ->/////////////////////////////////////////// Global variable definitions /////
  33. ->/////////////////////////////////////////////////////////////////////////////
  34. DEF    find_str    :    PTR TO CHAR
  35. DEF replace_str    :    PTR TO CHAR
  36.  
  37.  
  38. ->/////////////////////////////////////////////////////////////////////////////
  39. ->//////////////////////////////////////////////////////// Main procedure /////
  40. ->/////////////////////////////////////////////////////////////////////////////
  41. PROC main() HANDLE
  42.  
  43.     DEF rdargs = NIL , args : PTR TO LONG
  44.     DEF files : PTR TO LONG , filename : PTR TO CHAR
  45.     DEF file = NIL , file_start , file_length , file_end
  46.     DEF old_dir_lock = NIL , dir_lock = NIL
  47.  
  48.     PrintF( '          \c1;33;40\cMultiFR\c0;31;40\c v1.0\n' , $9B , $6D , $9B , $6D )
  49.     PutStr( 'Copyright © 1995, Lionel Vintenat\n' )
  50.     PrintF( '\c1;32;40\c---------------------------------\c0;31;40\c\n' , $9B , $6D , $9B , $6D )
  51.  
  52.     rdargs := ReadArgs( 'FIND_STR/A,REPLACE_STR/A,FILES/M/A' , NEW args[ NUMBER_ARGS ] , NIL )
  53.  
  54.     find_str := String( StrLen( args[ FIND_STR ] ) )
  55.     StrCopy( find_str , args[ FIND_STR ] )
  56.  
  57.     replace_str := String( StrLen( args[ REPLACE_STR ] ) )
  58.     StrCopy( replace_str , args[ REPLACE_STR ] )
  59.  
  60.     files := args[ FILES ]
  61.  
  62.     WHILE files[]
  63.  
  64.         filename , dir_lock := get_filenames( files[] )
  65.         old_dir_lock := CurrentDir( dir_lock )
  66.  
  67.         WHILE filename
  68.  
  69.             CtrlC()
  70.  
  71.             file :=  Open( filename , OLDFILE )
  72.             file_length := FileLength( filename )
  73.             file_end := ( file_start := NewR( file_length ) ) + file_length
  74.             Read( file , file_start ,  file_length )
  75.             Close( file ) ; file := NIL
  76.  
  77.             file := Open( filename , NEWFILE )
  78.             PutStr( filename )
  79.             parse_file( file , file_start , file_end )
  80.             Close( file ) ; file := NIL
  81.  
  82.             Dispose( file_start )
  83.  
  84.             filename := Next( filename )
  85.  
  86.         ENDWHILE
  87.  
  88.         CurrentDir( old_dir_lock ) ; old_dir_lock := NIL
  89.         UnLock( dir_lock ) ; dir_lock := NIL
  90.  
  91.         files++
  92.  
  93.     ENDWHILE
  94.  
  95. EXCEPT DO
  96.  
  97.     SELECT exception
  98.         CASE "ARGS"
  99.             PrintFault( IoErr() , NIL )
  100.         CASE "MEM"
  101.             PutStr( 'Out of memory !\n' )
  102.         CASE "DOS"
  103.             PrintFault( IoErr() , NIL )
  104.         CASE "^C"
  105.             PutStr( '***user break***\n' )
  106.     ENDSELECT
  107.  
  108.     IF old_dir_lock THEN CurrentDir( old_dir_lock )
  109.     IF dir_lock THEN UnLock( dir_lock )
  110.     IF file THEN Close( file )
  111.     IF rdargs THEN FreeArgs( rdargs )
  112.  
  113. ENDPROC
  114.  
  115.  
  116. ->/////////////////////////////////////////////////////////////////////////////
  117. ->//////////////////////////////////////////////////////// Version string /////
  118. ->/////////////////////////////////////////////////////////////////////////////
  119. CHAR '$VER: MultiFR 1.0 (14.4.95)'
  120.  
  121.  
  122. ->/////////////////////////////////////////////////////////////////////////////
  123. ->//////////////////////////////////////// Parses a file pattern argument /////
  124. ->/////////////////////////////////////////////////////////////////////////////
  125. PROC get_filenames( path_pattern ) HANDLE
  126.  
  127.     DEF pattern , path : PTR TO CHAR , dospattern : PTR TO CHAR
  128.     DEF filenames = NIL , dir_lock
  129.     DEF eac = NIL : PTR TO exallcontrol , ead : PTR TO exalldata
  130.     DEF buffer[ 2048 ] : ARRAY , more , i
  131.  
  132.     pattern := FilePart( path_pattern )
  133.     NEW path[ pattern - path_pattern + 1 ]
  134.     AstrCopy( path , path_pattern , pattern - path_pattern + 1 )
  135.  
  136.     dir_lock := Lock( path , ACCESS_READ )
  137.     eac := AllocDosObject( DOS_EXALLCONTROL , NIL )
  138.     NEW dospattern[ StrLen( pattern ) * 2 + 2 ]
  139.     ParsePatternNoCase( pattern , dospattern , StrLen( pattern ) * 2 + 2 )
  140.     eac.lastkey := NIL
  141.     eac.matchstring := dospattern
  142.     eac.matchfunc := NIL
  143.  
  144.     REPEAT
  145.  
  146.         more := ExAll( dir_lock , buffer , 2048 , ED_NAME , eac )
  147.         ead := buffer
  148.  
  149.         FOR i := 1 TO eac.entries
  150.  
  151.             filenames := Link( String( StrLen( ead.name ) ) , filenames )
  152.             StrCopy( filenames , ead.name )
  153.  
  154.             ead := ead.next
  155.  
  156.         ENDFOR
  157.  
  158.     UNTIL more = FALSE
  159.  
  160.     IF IoErr() <> ERROR_NO_MORE_ENTRIES THEN Raise( "DOS" )
  161.  
  162. EXCEPT DO
  163.  
  164.     IF eac THEN FreeDosObject( DOS_EXALLCONTROL , eac )
  165.     ReThrow()
  166.  
  167. ENDPROC filenames , dir_lock
  168.  
  169.  
  170. ->/////////////////////////////////////////////////////////////////////////////
  171. ->//////////////////////////////////////// Applies Find/Replace to a file /////
  172. ->/////////////////////////////////////////////////////////////////////////////
  173. PROC parse_file( file , file_start , file_end )
  174.  
  175.     DEF file_ptr1 : PTR TO CHAR , file_ptr2 : PTR TO CHAR
  176.  
  177.     file_ptr1 := ( file_ptr2 := file_start )
  178.  
  179.     WHILE file_ptr2 < file_end
  180.  
  181.         IF StrCmp( find_str , file_ptr2 , EstrLen( find_str ) )
  182.  
  183.             Fwrite( file , file_ptr1 , file_ptr2 - file_ptr1 , 1 )
  184.             Fwrite( file , replace_str , EstrLen( replace_str ) , 1 )
  185.             file_ptr2 := file_ptr2 + EstrLen( find_str )
  186.             file_ptr1 := file_ptr2
  187.  
  188.             PutStr( '.' )
  189.  
  190.         ELSE
  191.  
  192.             INC file_ptr2
  193.  
  194.         ENDIF
  195.  
  196.     ENDWHILE
  197.  
  198.     PutStr( '\n' )
  199.  
  200.     Fwrite( file , file_ptr1 , file_ptr2 - file_ptr1 , 1 )
  201.  
  202. ENDPROC
  203.